home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / docs / ippon / data / patfont2.lzh / PATFONT2TEXT.c < prev    next >
C/C++ Source or Header  |  1999-05-06  |  3KB  |  146 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <io.h>
  5.  
  6.  
  7. unsigned short *pat_file = NULL;
  8. unsigned char *text_work = NULL;
  9.  
  10. void usage (void)
  11. {
  12.     printf ("水平形式フォント変換 PATFONT2TEXT.X ver0.02\n"
  13.         "        programmed by Mitsuky <FreeSoftware>\n"
  14.         ".PAT 形式のフォントファイルを水平2ページの形式に変換します\n"
  15.         "使用法 : PATFONT2TEXT 読み込みファイル名.PAT 書き出しファイル名\n"
  16.         "16388 バイトの .PAT ファイル専用です\n");
  17. }
  18.  
  19.  
  20.  
  21. int load_sp (char *fname)
  22. {
  23.     FILE *fp;
  24.  
  25.     if ((fp = fopen (fname, "rb")) == NULL) {
  26.         printf ("%s が読めません\n", fname);
  27.         exit (-1);
  28.     }
  29.     pat_file = malloc (256 * 16 * 2 * 2 + 4);    /* +4 は .PAT ファイルのヘッダ */
  30.     fread (pat_file, 256 * 16 * 2 * 2 + 4, 1, fp);
  31.     fclose (fp);
  32.     return (0);
  33. }
  34.  
  35.  
  36.  
  37. int save_text (char *fname)
  38. {
  39.     FILE *fp;
  40.  
  41.     if ((fp = fopen (fname, "wb")) == NULL) {
  42.         printf ("%s が書けません\n", fname);
  43.         exit (-1);
  44.     }
  45.     fwrite (text_work, 2 * 8 * 32 * 2 * 2, sizeof (unsigned char), fp);
  46.     fclose (fp);
  47.     return (0);
  48. }
  49.  
  50.  
  51.  
  52. void conv (void)
  53. {
  54.     int i, j, k, x, y;
  55.     unsigned short *p, *p2;
  56.     unsigned short c;
  57.     unsigned char t0, t1, w;
  58.     unsigned char *q;
  59.  
  60.     text_work = malloc (2048);
  61.     q = text_work;
  62.  
  63.  
  64.     for (k = 0; k < 2; k++) {
  65.         for (i = 0; i < 32; i++) {
  66.             for (j = 0; j < 2; j++) {
  67.                 p = pat_file + 2 + i * 8 + j * 256 * 8 + k * 4096;    /* p = 左上のアドレス */
  68.  
  69.                 for (y = 0; y < 8; y++) {
  70.                     p2 = p;
  71.                     t0 = t1 = 0;
  72.                     w = 0x80;    /* チェックするビット */
  73.                     for (x = 0; x < 8; x++) {
  74.                         c = *p2++;
  75.                         if (c == 0x0f) {
  76.                             t0 |= w;    /* 0x0f なら両ページセット
  77.                                        */
  78.                             t1 |= w;
  79.                         }
  80.                         if (c == 0x0e) {
  81.                             t1 |= w;    /* 0x0e なら1ページのみセ
  82.                                        ット */
  83.                         }
  84.                         if (c == 0x0d) {
  85.                             t0 |= w;    /* 0x0d なら0ページのみセ
  86.                                        ット */
  87.                         }
  88.                         w >>= 1;
  89.                     }
  90.                     *q = t0;
  91.                     *(q + 8) = t1;
  92.                     q++;
  93.                     p += 256;
  94.                 }
  95.                 q += 8;
  96.             }
  97.         }
  98.     }
  99. }
  100.  
  101. int main (int argc, char *argv[])
  102. {
  103.     int i;
  104.     int slash_flag = 0;
  105.     char *load_fname = NULL, *save_fname = NULL;
  106.  
  107.     {
  108.         char *temp;
  109.  
  110.         temp = getenv ("SLASH");
  111.         if ((temp != NULL) && (*temp == '/')) {
  112.             slash_flag = 1;
  113.         }
  114.     }
  115.  
  116.     for (i = 1; i < argc; i++) {
  117.         if (('-' == *argv[i]) || ((slash_flag == 0) && ('/' == *argv[i]))) {
  118.             switch (*(argv[i] + 1)) {
  119.  
  120.             case 's':
  121.             case 'S':
  122.                 break;
  123.  
  124.             default:
  125.                 usage ();
  126.                 return (-1);
  127.             }
  128.         } else {
  129.             if (load_fname == NULL)
  130.                 load_fname = argv[i];
  131.             else
  132.                 save_fname = argv[i];
  133.         }
  134.     }
  135.  
  136.     if (save_fname == NULL) {
  137.         usage ();
  138.         return (-1);
  139.     }
  140.     load_sp (load_fname);
  141.     conv ();
  142.     save_text (save_fname);
  143.  
  144.     return (0);
  145. }
  146.